package LeetCode.interview;

import java.util.HashMap;

import util.LogUtils;

/*
 *
 * 
原题
 
　　Given a roman numeral, convert it to an integer. 
　　Input is guaranteed to be within the range from 1 to 3999. 

题目大意

　　给定一个罗马数字，将其转换成对应的整数。 
　　输入的数字在1-3999之间。 
	 注：I（1）、V（5）、X（10）、L（50）、C（100）、D（500）和M（1000）
	 	注：题目限制0~3999
解题思路
		罗马数字转成阿拉伯数字，这里面需要知道罗马数字的构成规则。罗马数字通过7个不同字母的重复或组合，能够表示出所有正整数（罗马数字中没有0）。
	
	    I = 1
	    V = 5
	    X = 10
	    L = 50
	    C = 100
	    D = 500
	    M = 1000
	
	比如：IV表示4，VI表示6，XIX表示19，XXI表示21。
	
	可以找到规律，如果左边的字母表示的数字小于右边的字母，则用右边的数字减去左边的数字；反之，则需要进行加法。
	
	我们从左向右进行遍历的时候，不太好计算出最终值；从另一个角度考虑，就是从右向左计算，就可以看出来了。
 * @Date 2017-09-24 23：47
 */
public class _013_Roman_to_Integer {
	private void initMap(HashMap<Character, Integer> map) {
		map.put('I', 1);		
		map.put('V', 5);
		map.put('X', 10);
		map.put('L', 50);
		map.put('C', 100);
		map.put('D', 500);	
		map.put('M', 1000);
	}
    public int romanToInt(String s) {
    	HashMap<Character, Integer> map = new HashMap<>();
    	initMap(map);
    	int rs = 0;
    	int pre = 0;
    	for (int i = s.length()-1; i >= 0; i --) {
    		int curValue = map.get(s.charAt(i));
    		if (curValue >= pre)
    			rs += curValue;
    		else rs -= curValue;
    		pre = curValue;
    	}
    	return rs;
    }
    
    public static void main(String[] args) {
		LogUtils.println("roman2int", new _013_Roman_to_Integer().romanToInt("IV"));
	}
}
